/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * MenuPrincipal.java
 *
 * Created on 26/11/2010, 18:16:15
 */

package presentacion;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import presentacion.utilidad.BarMenu;
import presentacion.utilidad.PopUpMenu;
import hibernate.objeto.Paciente;
import hibernate.objeto.Usuario;
import java.awt.Window;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JDialog;
import logica.CapaLogica;
import logica.PacienteLogica;
import logica.validacion.CapaValidacion;
import presentacion.acceso.Login;
import presentacion.acceso.RestriccionAcceso;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.Icono;
import presentacion.paciente.PacientePresentacion;
import presentacion.utilidad.Paginador;
import presentacion.utilidad.tabla.MiModeloTabla;

/**
 *
 * @author Rafael
 */
public class MenuPrincipal extends javax.swing.JFrame {

    public static Usuario usuarioActivo;

    /** Creates new form MenuPrincipal */
    public MenuPrincipal(Usuario usuarioActivo) {
        initComponents();
        setSize(CapaPresentacion.getTamañoMaximoJDialog());
        this.setLocationRelativeTo(null);

        MenuPrincipal.usuarioActivo = usuarioActivo;
        RestriccionAcceso.determinarAccesoUsuario(usuarioActivo);

        personalizarJDialog();
        setearEventosQueCapturanTeclaEnterYEscape();
    }

    private void personalizarJDialog() {
        setearIconoDeSistema();
        
        //Crea la barra de menu
        this.setJMenuBar(BarMenu.createMenuBarMenuPrincipal(
                tablaPaciente, this));

        iniciarPaginador();

        MiModeloTabla.cargarTablaPaciente(
                PacienteLogica.getVectorPaciente(), tablaPaciente);
        busqueda.requestFocus();
    }
    
    /**
     * Setea el icono dle sistema.
     * 
     */
    private void setearIconoDeSistema() {
        //Se recupera el archivo del directorio donde se ecuentra el jar, se normaliza el espacio
        String fileName = new File(CapaPresentacion.class.
                getProtectionDomain().getCodeSource().getLocation().getPath()).
                getParent().replaceAll("%20", " ");

        fileName = CapaLogica.reemplazarUnaBarraInvertidaPorDosBarrasInvertidas(
                fileName + "\\imagenes\\imagen_agile.png");

        this.setIconImage(this.getToolkit().getImage(fileName));
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        botonAgregarPaciente = new javax.swing.JButton();
        botonBuscar = new javax.swing.JButton();
        busqueda = new javax.swing.JTextField();
        tablaPacienteScrollPanel = new javax.swing.JScrollPane();
        tablaPaciente = new javax.swing.JTable(new MiModeloTabla());
        textoDescriptivoVentana = new javax.swing.JLabel();
        paginadorUno = new javax.swing.JPanel();
        botonAnteriorPaginadorUno = new javax.swing.JButton();
        botonSiguientePaginadorUno = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Agile - HCI");
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
        });

        botonAgregarPaciente.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonAgregarPaciente.setForeground(Fuente.COLOR_NORMAL);
        botonAgregarPaciente.setIcon(Icono.ICONO_16_AGREGAR_USUARIO);
        botonAgregarPaciente.setText("Agregar Paciente");
        botonAgregarPaciente.setToolTipText("Agregar un paciente al sistema");
        botonAgregarPaciente.setPreferredSize(new java.awt.Dimension(175, 23));
        botonAgregarPaciente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAgregarPacienteActionPerformed(evt);
            }
        });

        botonBuscar.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonBuscar.setForeground(Fuente.COLOR_NORMAL);
        botonBuscar.setIcon(Icono.ICONO_16_BUSCAR);
        botonBuscar.setText("Buscar");
        botonBuscar.setToolTipText("Buscar paciente");
        botonBuscar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonBuscarActionPerformed(evt);
            }
        });

        busqueda.setFont(Fuente.FUENTE_AYUDA);
        busqueda.setForeground(Fuente.COLOR_AYUDA);
        busqueda.setText("Ingrese apellido o número de documento");
        busqueda.setToolTipText("Ingrese apellido o número de documento");
        busqueda.setPreferredSize(new java.awt.Dimension(210, 23));
        busqueda.setCaretPosition(0);
        busqueda.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                busquedaKeyPressed(evt);
            }
            public void keyReleased(java.awt.event.KeyEvent evt) {
                busquedaKeyReleased(evt);
            }
        });

        tablaPacienteScrollPanel.setMinimumSize(new java.awt.Dimension(0, 0));
        tablaPacienteScrollPanel.setPreferredSize(new java.awt.Dimension(690, 225));

        tablaPaciente.setToolTipText("Seleccione el paciente a gestionar");
        tablaPaciente.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaPacienteMouseClicked(evt);
            }
        });
        tablaPacienteScrollPanel.setViewportView(tablaPaciente);
        MiModeloTabla.inicializarTabla(tablaPaciente);

        textoDescriptivoVentana.setFont(Fuente.FUENTE_TITULO_2);
        textoDescriptivoVentana.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoVentana.setText("Seleccione el paciente para su gestión");
        textoDescriptivoVentana.setPreferredSize(new java.awt.Dimension(762, 20));

        paginadorUno.setMaximumSize(new java.awt.Dimension(700, 14));

        botonAnteriorPaginadorUno.setFont(new java.awt.Font("Tahoma", 0, 10));
        botonAnteriorPaginadorUno.setIcon(Icono.ICONO_16_ANTERIOR);
        botonAnteriorPaginadorUno.setPreferredSize(new java.awt.Dimension(43, 23));
        botonAnteriorPaginadorUno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAnteriorPaginadorUnoActionPerformed(evt);
            }
        });

        botonSiguientePaginadorUno.setFont(new java.awt.Font("Tahoma", 0, 10));
        botonSiguientePaginadorUno.setIcon(Icono.ICONO_16_SIGUIENTE);
        botonSiguientePaginadorUno.setPreferredSize(new java.awt.Dimension(43, 23));
        botonSiguientePaginadorUno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSiguientePaginadorUnoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout paginadorUnoLayout = new javax.swing.GroupLayout(paginadorUno);
        paginadorUno.setLayout(paginadorUnoLayout);
        paginadorUnoLayout.setHorizontalGroup(
            paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paginadorUnoLayout.createSequentialGroup()
                .addComponent(botonAnteriorPaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(botonSiguientePaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        paginadorUnoLayout.setVerticalGroup(
            paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(botonAnteriorPaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(botonSiguientePaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(tablaPacienteScrollPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 1004, Short.MAX_VALUE)
                    .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 1004, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(botonAgregarPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 503, Short.MAX_VALUE)
                        .addComponent(busqueda, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(paginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonAgregarPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(busqueda, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(tablaPacienteScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(paginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botonBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonBuscarActionPerformed
        Paginador.paginarElemento[0] = false;
        buscarSegunCriterio();
}//GEN-LAST:event_botonBuscarActionPerformed

    private void botonAgregarPacienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAgregarPacienteActionPerformed
        Paginador.paginarElemento[0] = false;
        agregarOModificarPaciente(null);
}//GEN-LAST:event_botonAgregarPacienteActionPerformed

    private void tablaPacienteMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaPacienteMouseClicked
        //Selecciona con doble click
        if (evt.getClickCount() == 2 && evt.getButton() == 1) {
            gestionarPaciente();
        } else {
        //Despliega pop-up
        PopUpMenu.createPopupMenuPaciente(tablaPaciente, this);
        }
    }//GEN-LAST:event_tablaPacienteMouseClicked

    private void busquedaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_busquedaKeyPressed
        if (busqueda.getText().equalsIgnoreCase(
                "Ingrese apellido o número de documento")) {
            busqueda.setFont(Fuente.FUENTE_TEXTFIELD);
            busqueda.setForeground(Fuente.COLOR_NORMAL);
            busqueda.setText("");
            busqueda.setCaretPosition(0);
        }
    }//GEN-LAST:event_busquedaKeyPressed

    private void busquedaKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_busquedaKeyReleased
        if(busqueda.getText().isEmpty()){
            busqueda.setFont(Fuente.FUENTE_AYUDA);
            busqueda.setForeground(Fuente.COLOR_AYUDA);
            busqueda.setText("Ingrese apellido o número de documento");
            busqueda.setCaretPosition(0);
        }
    }//GEN-LAST:event_busquedaKeyReleased

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
        salirDelSistema();
    }//GEN-LAST:event_formWindowClosed

    private void botonAnteriorPaginadorUnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAnteriorPaginadorUnoActionPerformed
        paginarAtrasTablaPaciente();
}//GEN-LAST:event_botonAnteriorPaginadorUnoActionPerformed

    private void botonSiguientePaginadorUnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSiguientePaginadorUnoActionPerformed
        paginarAdelanteTablaPaciente();
}//GEN-LAST:event_botonSiguientePaginadorUnoActionPerformed

    /**
     * Sale complemtamente del sistema.
     * 
     */
    public static void salirDelSistema() {
        //Borra los archivos temporales creados
        CapaLogica.eliminarArchivosTemporales();
        //Cierra la ventana
        System.exit(0);
    }

    /**
     * Cambia de usuario activo.
     *
     * @param evt
     */
    public static void cambiarUsuario() {
        Usuario usuarioAntes = usuarioActivo;
        new Login(null, true).setVisible(true);

        if (usuarioAntes != usuarioActivo) {
            //Cierra todos los JDialogs abiertos
            for (Window window: Window.getWindows()) {
                if (window instanceof JDialog) {
                    window.dispose();
                }
            }
        }
    }

    /**
     * Según el criterio de busqueda consulta a la base de datos para mostrar
     * los resultados en la tabla.
     *
     */
    private void buscarSegunCriterio() {
        //Si corresponde vuelve a cero el indice del paginador, de lo contrario
        //Lo deja en el valor que se encuentra
        Paginador.actualizaIndice(0);
        if (busqueda.getText().
                equalsIgnoreCase("Ingrese apellido o número de documento")) {
            busqueda.setText("");
        }

        //Número de documento
        if (CapaValidacion.esTodoNumero(busqueda.getText())) {
            vectorPaciente = PacienteLogica.
                    getVectorPacientePorNumeroDocumentoYEnBd(busqueda.getText());

        //Apellido
        } else {
            vectorPaciente = PacienteLogica.
                    getVectorPacientePorApellidoYEnBd(busqueda.getText());
        }

        MiModeloTabla.cargarTablaPaciente(vectorPaciente, tablaPaciente);

        if (busqueda.getText().isEmpty()) {
            busqueda.setText("Ingrese apellido o número de documento");
        }
    }

    /**
     * Inicia la gestión del paciente.
     *
     */
    public void gestionarPaciente() {
        Paciente paciente = (Paciente) MiModeloTabla.recuperarObjetoDeTabla(
                Paciente.class.getName(),
                tablaPaciente);

        if (paciente != null) {
            RestriccionAcceso.GestionPacientePresentacion(this, true, paciente);
            busqueda.setText("");
            iniciarPaginador();
            buscarSegunCriterio();
            while (!MiModeloTabla.seleccionarFilaDeTabla(String.valueOf(
                    paciente.getIdPaciente()), tablaPaciente, tablaPacienteScrollPanel)) {
                paginarAdelanteTablaPaciente();
            }
        }
    }

    /**
     * Agrega un paciente.
     *
     * @param paciente
     */
    public void agregarOModificarPaciente(Paciente paciente) {
        RestriccionAcceso.PacientePresentacion(null, true, paciente);
        if (PacientePresentacion.isPacienteAgregadoOModificado()) {
            busqueda.setText("");
            iniciarPaginador();
            buscarSegunCriterio();
            while (!MiModeloTabla.seleccionarFilaDeTabla(String.valueOf(
                    PacientePresentacion.getPaciente().getIdPaciente()),
                    tablaPaciente, tablaPacienteScrollPanel)) {
                paginarAdelanteTablaPaciente();
            }
            RestriccionAcceso.GestionPacientePresentacion(
                    this, true, PacientePresentacion.getPaciente());
        }
    }

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     *
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerBusqueda = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    buscarSegunCriterio();
                }

            }
        };
        //Declaración del evento a capturar
        KeyListener keyListenerGestionarPaciente = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    gestionarPaciente();
                }
            }
        };
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    salirDelSistema();
                }
            }
        };
        //Setear eventos
        busqueda.addKeyListener(keyListenerBusqueda);
        busqueda.addKeyListener(keyListenerEscape);

        tablaPaciente.addKeyListener(keyListenerGestionarPaciente);
        tablaPaciente.addKeyListener(keyListenerEscape);

        botonAnteriorPaginadorUno.addKeyListener(keyListenerEscape);
        botonSiguientePaginadorUno.addKeyListener(keyListenerEscape);
        
        botonAgregarPaciente.addKeyListener(keyListenerEscape);
        botonBuscar.addKeyListener(keyListenerEscape);
    }

    /**
     * Inicia el/los paginadores activos en esta ventana
     */
    private void iniciarPaginador() {
        //Rango de filas para cada paginador
        int rangoFilas[] = new int[CapaLogica.PAGINADOR_PAGINADORES_SIMULTANEOS];

        //Rango de filas para el paginador 1
        rangoFilas[0] = 50;
        //Rango de filas para el paginador 2
        rangoFilas[1] = 10;
        //Rango de filas para el paginador 3
        rangoFilas[2] = 0;

        Paginador.inicializarPaginador(rangoFilas);
    }

    /**
     * Realiza la paginación hacia atrás.
     */
    private void paginarAtrasTablaPaciente() {
        //Retrocede el los índices
        Paginador.atrasPaginador(0);
        Paginador.paginarElemento[0] = true;

        //Vuelve a buscar con los nuevos índices
        if (tablaPaciente.getModel().getColumnCount() > 0) {
               buscarSegunCriterio();
        }
    }

    /**
     * Realiza la paginación hacia adelante, teniendo en cuenta que existan elementos,
     * de lo contrario no procede a listarlos.
     */
    private void paginarAdelanteTablaPaciente() {
        //Adelanta los índices
        Paginador.adelantePaginador(0);
        Paginador.paginarElemento[0] = true;

        //Vuelve a buscar con los nuevos índices
        if (tablaPaciente.getModel().getColumnCount() > 0) {
                buscarSegunCriterio();
                //Si no hay elementos siguientes se vuelven los índices hacia atras
                if (vectorPaciente == null) {
                    Paginador.atrasPaginador(0);
                }
                buscarSegunCriterio();
        }
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonAgregarPaciente;
    private javax.swing.JButton botonAnteriorPaginadorUno;
    private javax.swing.JButton botonBuscar;
    private javax.swing.JButton botonSiguientePaginadorUno;
    private javax.swing.JTextField busqueda;
    private javax.swing.JPanel paginadorUno;
    private javax.swing.JTable tablaPaciente;
    private javax.swing.JScrollPane tablaPacienteScrollPanel;
    private javax.swing.JLabel textoDescriptivoVentana;
    // End of variables declaration//GEN-END:variables
    private Vector<Paciente> vectorPaciente;

}
